package cz.muni.fi.pa036.kiss.serviceimpl;

import cz.muni.fi.pa036.kiss.Entity.KolejAssembler;
import cz.muni.fi.pa036.kiss.Entity.KolejDTO;
import cz.muni.fi.pa036.kiss.Entity.Pokoj;
import cz.muni.fi.pa036.kiss.Entity.PokojAssembler;
import cz.muni.fi.pa036.kiss.Entity.PokojDTO;
import cz.muni.fi.pa036.kiss.dao.PokojDAO;
import cz.muni.fi.pa036.kiss.service.PokojService;
import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

public class PokojServiceImpl implements PokojService {

    @Autowired
    private PokojDAO pokojDao;
    @Autowired
    private PokojAssembler assembler;
    @Autowired
    private KolejAssembler kolejAss;

    @Transactional
    @Override
    public void createPokoj(PokojDTO pokoj) {
        if (pokoj == null) {
            throw new IllegalArgumentException("pokoj is null: ");
        }
        if (pokoj.getId() != null) {
            throw new IllegalArgumentException("id is not null");
        }
        Pokoj pok = assembler.createEntityfromDTO(pokoj);
        pokojDao.createPokoj(pok);
        pokoj.setId(pok.getId());
    }

    @Transactional(readOnly = true)
    @Override
    public PokojDTO getPokojById(Long id) {
        if (id == null) {
            throw new IllegalArgumentException("id is null");
        }
        PokojDTO pokoj = assembler.createDTOfromEntity(pokojDao.getPokojById(id));
        if (pokoj == null) {
            return null;
        } else {
            return pokoj;
        }
    }

    @Transactional(readOnly = true)
    @Override
    public PokojDTO getPokojByNumber(int cislo, KolejDTO kolej) {
        if (kolej == null) {
            throw new IllegalArgumentException("kolej is null");
        }
        PokojDTO ubytovani = assembler.createDTOfromEntity(pokojDao.getPokojByNumber(cislo, kolejAss.createEntityfromDTO(kolej)));
        if (ubytovani == null) {
            return null;
        } else {
            return ubytovani;
        }
    }

    @Transactional
    @Override
    public void updatePokoj(PokojDTO pokoj) {
        if (pokoj == null) {
            throw new IllegalArgumentException("pokoj is null");
        }
        pokojDao.updatePokoj(assembler.createEntityfromDTO(pokoj));
    }

    @Transactional
    @Override
    public void removePokoj(PokojDTO pokoj) {
        if (pokoj == null) {
            throw new IllegalArgumentException("pokoj is null");
        }
        pokojDao.removePokoj(assembler.createEntityfromDTO(pokoj));
    }

    @Transactional(readOnly = true)
    @Override
    public List<PokojDTO> findAll() {
        List<Pokoj> all = pokojDao.findAll();
        List<PokojDTO> allDto = new ArrayList<PokojDTO>();
        for (Pokoj pokoj : all) {
            allDto.add(assembler.createDTOfromEntity(pokoj));
        }
        return allDto;
    }
}
